/*
 * Fichier: Personne.java
 * Crée le: 14 janvier 2007.
 * Modifié: 12 octobre 2008.
 * Auteurs: Sébastien ESTIENNE.
 * SiteWeb: http://www.prog-info.org/
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

package chapitre7.personne;



/**
 * <p>Classe représentant une personne.</p>
 * @author Sébastien ESTIENNE.
 */
public class Personne
{
   /** Nom de la personne. */
   private String nom;

   /** Prénom de la personne. */
   private String prenom;

   /** Age de la personne. */
   private Integer age;

   /** Sexe de la personne. */
   private TSexe sexe;

   /** Age minimum. */
   private static final int AGE_MIN = 0;

   /** Age maximum. */
   private static final int AGE_MAX = 130;


   /**
    * <p>Constructeur par défaut d'une personne.</p>
    */
   public Personne()
   {
      this(null, null, null, TSexe.Masculin);
   }


   /**
    * <p>Constructeur de personne avec un nom et un prénom spécifiés.</p>
    * @param nom Le nom de la personne.
    * @param prenom Le prénom de la personne.
    */
   public Personne(String nom, String prenom)
   {
      this(nom, prenom, 0, TSexe.Masculin);
   }


   /**
    * <p>Constructeur de personne avec un nom, un prénom et un âge spécifiés.</p>
    * @param nom Le nom de la personne.
    * @param prenom Le prénom de la personne.
    * @param age L'âge de la personne.
    */
   public Personne(String nom, String prenom, Integer age)
   {
      this(nom, prenom, age, TSexe.Masculin);
   }


   /**
    * <p>Constructeur de personne avec un nom, un prénom, un âge et un sexe spécifiés.</p>
    * @param nom Le nom de la personne.
    * @param prenom Le prénom de la personne.
    * @param age L'âge de la personne.
    * @param sexe Le sexe de la personne.
    * @throws IllegalArgumentException Si l'âge de la personne est incorrect.
    */
   public Personne(String nom, String prenom, Integer age, TSexe sexe) throws IllegalArgumentException
   {
      setNom(nom);
      setPrenom(prenom);
      setAge(age);
      setSexe(sexe);
   }


   /**
    * <p>Constructeur de personne à partir d'une personne existante.</p>
    * @param personne Une personne.
    */
   public Personne(Personne personne)
   {
      this(personne.getNom(), personne.getPrenom(), personne.getAge(), personne.getSexe());
   }


   /**
    * <p>Retourne l'âge de la personne.</p>
    * @return Renvoie l'âge de la personne.
    */
   public Integer getAge()
   {
      return this.age;
   }


   /**
    * <p>Modifie l'âge de la personne.</p>
    * @param age L'âge de la personne.
    * @throws IllegalArgumentException Si l'âge de la personne est incorrect.
    */
   public void setAge(Integer age) throws IllegalArgumentException
   {
      if(age != null && (age < AGE_MIN || age > AGE_MAX))
      {
         StringBuilder message = new StringBuilder();
         message.append(age);
         message.append(" est un âge incorrect. Il doit être compris entre ");
         message.append(AGE_MIN);
         message.append(" et ");
         message.append(AGE_MAX);
         message.append(".");
         
         throw new IllegalArgumentException(message.toString());
      }

      this.age = age;
   }


   /**
    * <p>Retourne le nom de la personne.</p>
    * @return Renvoie le nom de la personne.
    */
   public String getNom()
   {
      return this.nom;
   }


   /**
    * <p>Modifie le nom de la personne.</p>
    * @param nom Le nom de la personne.
    */
   public void setNom(String nom)
   {
      this.nom = nom;
   }


   /**
    * <p>Retourne le prénom de la personne.</p>
    * @return Renvoie le prénom de la personne.
    */
   public String getPrenom()
   {
      return this.prenom;
   }


   /**
    * <p>Modifie le prénom de la personne.</p>
    * @param prenom Le prénom de la personne.
    */
   public void setPrenom(String prenom)
   {
      this.prenom = prenom;
   }


   /**
    * <p>Retourne le sexe de la personne.</p>
    * @return Renvoie le sexe de la personne.
    */
   public TSexe getSexe()
   {
      return this.sexe;
   }


   /**
    * <p>Modifie le sexe de la personne.</p>
    * @param sexe Le sexe de la personne.
    */
   public void setSexe(TSexe sexe)
   {
      this.sexe = sexe;
   }


   /**
    * <p>Retourne une représentation d'une personne.</p>
    * @return Renvoie une représentation d'une personne.
    */
   @Override
   public String toString()
   {
      StringBuilder resultat = new StringBuilder();

      resultat.append("Personne : { ");
      resultat.append("nom : ").append(getNom()).append("; ");
      resultat.append("prénom : ").append(getPrenom()).append("; ");
      resultat.append("âge : ").append(getAge()).append(" an(s); ");
      resultat.append("sexe : ").append(getSexe());
      resultat.append(" }");

      return resultat.toString();
   }
}
